package com.wuseguang.springcloud.util;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.BucketInfo;
import com.aliyun.oss.model.Callback;
import com.aliyun.oss.model.Callback.CalbackBodyType;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

/**
 * 此处上传的文件全部上传到阿里云  oss简单上传 最大文件上传5GB
 */
public class CallbackSample {


    static Logger logger = LoggerFactory.getLogger(CallbackSample.class);

    // endpoint是访问OSS的域名。如果您已经在OSS的控制台上 创建了Bucket，请在控制台上查看域名。
    // 如果您还没有创建Bucket，endpoint选择请参看文档中心的“开发人员指南 > 基本概念 > 访问域名”，
    // 链接地址是：https://help.aliyun.com/document_detail/oss/user_guide/oss_concept/endpoint.html?spm=5176.docoss/user_guide/endpoint_region
    // endpoint的格式形如“http://oss-cn-hangzhou.aliyuncs.com/”，注意http://后不带bucket名称，
    // 比如“http://bucket-name.oss-cn-hangzhou.aliyuncs.com”，是错误的endpoint，请去掉其中的“bucket-name”。
    //非加速通道-内网
    //private static String endpoint = "http://oss-cn-shenzhen-internal.aliyuncs.com";
    //非加速通道-外网
    private static String endpoint = "http://oss-cn-shenzhen.aliyuncs.com";
    //加速通道
    //private static String endpoint = "http://oss-accelerate.aliyuncs.com";

    // accessKeyId和accessKeySecret是OSS的访问密钥，您可以在控制台上创建和查看，
    // 创建和查看访问密钥的链接地址是：https://ak-console.aliyun.com/#/。
    // 注意：accessKeyId和accessKeySecret前后都没有空格，从控制台复制时请检查并去除多余的空格。
    private static String accessKeyId = "LTAI4FjvWoR8TxMjL1Czqpim";
    private static String accessKeySecret = "74HnMNhIFixDpJzT8tWrCGpFjSium1";

    // Bucket用来管理所存储Object的存储空间，详细描述请参看“开发人员指南 > 基本概念 > OSS基本概念介绍”。
    // Bucket命名规范如下：只能包括小写字母，数字和短横线（-），必须以小写字母或者数字开头，长度必须在3-63字节之间。
    private static String bucketName = "yguo";

    // Object是OSS存储数据的基本单元，称为OSS的对象，也被称为OSS的文件。详细描述请参看“开发人员指南 > 基本概念 > OSS基本概念介绍”。
    // Object命名规范如下：使用UTF-8编码，长度必须在1-1023字节之间，不能以“/”或者“\”字符开头。
    private static String firstKey = "UTF-8";


    /**
     * 保存在文件
     *
     * @param file     文件
     * @param schoolId 学校信息
     * @param type     文件类型 1图片，2文本，3人脸
     * @return 文件路径
     */
    public static String saveFile(MultipartFile file, String schoolId, int type) {

        logger.info("Started");
        //获取图片名字
        String fileKey = "";

        String originalFilename = file.getOriginalFilename();
        // 获取文件后缀
        String prefix = originalFilename.substring(originalFilename.lastIndexOf("."));

        //判断文件类型
        if (type == 1) {
            logger.info("图片信息存储");
            fileKey = schoolId + "/picture/" + UUIDGenerator.getUUID() + prefix;
        } else if (type == 2) {
            logger.info("文本存储");
            fileKey = schoolId + "/file/" + UUIDGenerator.getUUID() + prefix;
        } else if (type == 3) {
            logger.info("人脸图片存储");
            fileKey = schoolId + "/face/" + UUIDGenerator.getUUID() + prefix;
        } else if (type == 4) {
            logger.info("视频存储");
            fileKey = schoolId + "/video/" + UUIDGenerator.getUUID() + prefix;
        } else if (type == 5) {
            logger.info("班牌日志信息");
            fileKey = schoolId + "/banCardLog/" + DateUtil.time() + "-" + originalFilename;
        } else {
            logger.info("班牌版本存储");
            fileKey = schoolId + "/banCard/" + UUIDGenerator.getUUID() + prefix;
        }
        // 生成OSSClient，您可以指定一些参数，详见“SDK手册 > Java-SDK > 初始化”，
        // 链接地址是：https://help.aliyun.com/document_detail/oss/sdk/java-sdk/init.html?spm=5176.docoss/sdk/java-sdk/get-start
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {

            // 判断Bucket是否存在。详细请参看“SDK手册 > Java-SDK > 管理Bucket”。
            // 链接地址是：https://help.aliyun.com/document_detail/oss/sdk/java-sdk/manage_bucket.html?spm=5176.docoss/sdk/java-sdk/init
            if (ossClient.doesBucketExist(bucketName)) {
                System.out.println("您已经创建Bucket：" + bucketName + "。");
            } else {
                System.out.println("您的Bucket不存在，创建Bucket：" + bucketName + "。");
                // 创建Bucket。详细请参看“SDK手册 > Java-SDK > 管理Bucket”。
                // 链接地址是：https://help.aliyun.com/document_detail/oss/sdk/java-sdk/manage_bucket.html?spm=5176.docoss/sdk/java-sdk/init
                ossClient.createBucket(bucketName);
            }

            // 查看Bucket信息。详细请参看“SDK手册 > Java-SDK > 管理Bucket”。
            // 链接地址是：https://help.aliyun.com/document_detail/oss/sdk/java-sdk/manage_bucket.html?spm=5176.docoss/sdk/java-sdk/init
            BucketInfo info = ossClient.getBucketInfo(bucketName);
            System.out.println("Bucket " + bucketName + "的信息如下：");
            System.out.println("\t数据中心：" + info.getBucket().getLocation());
            System.out.println("\t创建时间：" + info.getBucket().getCreationDate());
            System.out.println("\t用户标志：" + info.getBucket().getOwner());

            // 文件存储入OSS，Object的名称为fileKey。详细请参看“SDK手册 > Java-SDK > 上传文件”。
            // 链接地址是：https://help.aliyun.com/document_detail/oss/sdk/java-sdk/upload_object.html?spm=5176.docoss/user_guide/upload_object

            ossClient.putObject(bucketName, fileKey, FileUtil.MultipartFileToFile(file));
            System.out.println("Object：" + fileKey + "存入OSS成功。");


        } catch (OSSException oe) {
            oe.printStackTrace();
            return "error";
        } catch (ClientException ce) {
            ce.printStackTrace();
            return "error";
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ossClient.shutdown();
        }

        logger.info("Completed");
        return "https://oss.yuguozhijia.online/" + fileKey;
    }


    /**
     * 保存在文件
     *
     * @param file     文件
     * @param schoolId 学校信息
     * @param type     文件类型 1图片，2文本，3人脸
     * @return 文件路径
     */
    public static String saveFile(File file, String schoolId, int type) {

        logger.info("Started");
        //获取图片名字
        String fileKey = "";

        String originalFilename = file.getName();
        // 获取文件后缀
        String prefix = originalFilename.substring(originalFilename.lastIndexOf("."));

        //判断文件类型
        if (type == 1) {
            logger.info("图片信息存储");
            fileKey = schoolId + "/picture/" + UUIDGenerator.getUUID() + prefix;
        } else if (type == 2) {
            logger.info("文本存储");
            fileKey = schoolId + "/file/" + UUIDGenerator.getUUID() + prefix;
        } else if (type == 3) {
            logger.info("人脸图片存储");
            fileKey = schoolId + "/face/" + UUIDGenerator.getUUID() + prefix;
        } else if (type == 4) {
            logger.info("视频存储");
            fileKey = schoolId + "/video/" + UUIDGenerator.getUUID() + prefix;
        } else if (type == 5) {
            logger.info("班牌日志信息");
            fileKey = schoolId + "/banCardLog/" + DateUtil.time() + "-" + originalFilename;
        } else {
            logger.info("班牌版本存储");
            fileKey = schoolId + "/banCard/" + UUIDGenerator.getUUID() + prefix;
        }

        // 生成OSSClient，您可以指定一些参数，详见“SDK手册 > Java-SDK > 初始化”，
        // 链接地址是：https://help.aliyun.com/document_detail/oss/sdk/java-sdk/init.html?spm=5176.docoss/sdk/java-sdk/get-start
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {

            // 判断Bucket是否存在。详细请参看“SDK手册 > Java-SDK > 管理Bucket”。
            // 链接地址是：https://help.aliyun.com/document_detail/oss/sdk/java-sdk/manage_bucket.html?spm=5176.docoss/sdk/java-sdk/init
            if (ossClient.doesBucketExist(bucketName)) {
                System.out.println("您已经创建Bucket：" + bucketName + "。");
            } else {
                System.out.println("您的Bucket不存在，创建Bucket：" + bucketName + "。");
                // 创建Bucket。详细请参看“SDK手册 > Java-SDK > 管理Bucket”。
                // 链接地址是：https://help.aliyun.com/document_detail/oss/sdk/java-sdk/manage_bucket.html?spm=5176.docoss/sdk/java-sdk/init
                ossClient.createBucket(bucketName);
            }

            // 查看Bucket信息。详细请参看“SDK手册 > Java-SDK > 管理Bucket”。
            // 链接地址是：https://help.aliyun.com/document_detail/oss/sdk/java-sdk/manage_bucket.html?spm=5176.docoss/sdk/java-sdk/init
            BucketInfo info = ossClient.getBucketInfo(bucketName);
            System.out.println("Bucket " + bucketName + "的信息如下：");
            System.out.println("\t数据中心：" + info.getBucket().getLocation());
            System.out.println("\t创建时间：" + info.getBucket().getCreationDate());
            System.out.println("\t用户标志：" + info.getBucket().getOwner());

            // 文件存储入OSS，Object的名称为fileKey。详细请参看“SDK手册 > Java-SDK > 上传文件”。
            // 链接地址是：https://help.aliyun.com/document_detail/oss/sdk/java-sdk/upload_object.html?spm=5176.docoss/user_guide/upload_object

            ossClient.putObject(bucketName, fileKey, file);
            System.out.println("Object：" + fileKey + "存入OSS成功。");


        } catch (OSSException oe) {
            oe.printStackTrace();
            return "error";
        } catch (ClientException ce) {

            ce.printStackTrace();
            return "error";
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("fileKey：" + fileKey );
            ossClient.shutdown();
        }

        logger.info("Completed");
        return "https://oss.yuguozhijia.online/" + fileKey;
    }

    /**
     * 删除文件
     * @param url 文件url
     * @return
     */
    public static String deleteFile(String url){


        try{


            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            //拆分连接
            String [] urls =url.split(",");
            //循环连接
            for (int i = 0;i<urls.length;i++){
                //要删除的文件名
                String fileName =urls[i].replace("https://oss.yuguozhijia.online/","");
                // 删除文件。如需删除文件夹，请将ObjectName设置为对应的文件夹名称。如果文件夹非空，则需要将文件夹下的所有object删除后才能删除该文件夹。
                ossClient.deleteObject(bucketName, fileName);
            }
            // 关闭OSSClient。
            ossClient.shutdown();
        }catch (Exception e){
            logger.error("e",e);
            return "error";
        }
        return "success";
    }





    public static void main(String[] args) {


        File file = new File("D:\\123.jpg");
      System.err.println(file.exists());

    }

    public static String getEndpoint() {
        return endpoint;
    }

    public static String getAccessKeyId() {
        return accessKeyId;
    }

    public static String getAccessKeySecret() {
        return accessKeySecret;
    }
}
